2025.5.29 ヘッセ行列【torch】
次の関数のヘッセ行列を求める。
$ f(x,y,z) = x^3 + y^2 + z^3 - 3xz - 4y
解析的には次のように与えられている。
$ H = \left[\begin{array}{rrr} 6x&0&-3\\ 0&2&0\\ -3&0&6z \end{array}\right]
求める手段は次の二通りとし、結果を比較する。
1. 解析的に与えられた式を用いた関数を利用
2. PyTorchの提供するヘッセ行列を求める関数を利用
code:hessian1.py
import torch as pt
import torch.autograd.functional as ptaf
# 元の関数
def func1(p):
x, y, z = p
return x**3 + y**2 + z**3 - 3*x*z - 4*y
# func1のヘッセ行列
def func1_hess(p):
x, y, z = p
return pt.tensor(6*x, 0, -3], 0, 2, 0, [-3, 0, 6*z) x = pt.tensor((1, 2, 2), dtype=pt.float)
print('点:', x)
result1 = func1(x)
print('3変数のスカラ関数f(x)')
print(result1)
print('解析的に求めたヘッセ行列')
hess1 = func1_hess(x)
print(hess1)
print('hessian関数で数値的に求めたヘッセ行列')
hess2 = ptaf.hessian(func1, x)
print(hess2)
print('ヘッセ行列の固有値')
eigval, eigvec = pt.linalg.eig(hess2)
print(eigval)
結果:
code:result.txt
3変数のスカラ関数f(x)
tensor(-1.)
解析的に求めたヘッセ行列
hessian関数で数値的に求めたヘッセ行列
ヘッセ行列の固有値
ということで、正しく求められていることが確認できる。
計算量はどの程度なのだろうか?